import * as auth from '@/utils/auth'
import { getUserInfo, login, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router/index.js'
// import { get } from 'core-js/core/dict'
export default {
  namespaced: true,
  state: {
    token: auth.getToken() || null,
    userInfo: {}
  },
  mutations: {
    // 存储token+存cookies本地持久化
    setToken (state, payload) {
      state.token = payload
      auth.setToken(payload)
    },
    // 删除token
    removeToken (state, payload) {
      state.token = null
      auth.removeToken()
    },

    // 设置用户信息
    setUserInfo (state, payload) {
      state.userInfo = payload
    },
    // 删除用户信息
    delUserInfo (state) {
      state.userInfo = {}
    }
  },
  actions: {
    // 封装异步方法 ===>同一发送请求
    async setTokenApi ({ commit }, loginForm) {
      const token = await login(loginForm)
      // console.log('vuex里的action获取token', token)
      // 调用mutations方法存储token
      commit('setToken', token)
    },

    // 获取用户信息请求
    async getUserInfo ({ commit }) {
      const data = await getUserInfo()
      // console.log('用户信息', data)
      // 获取到用户信息,根据信息里的id在请求头像信息
      const avatar = await getUserDetailById(data.userId)
      // console.log('头像信息', avatar)
      // 将连个用户的响应信息对象合并一起存到userInfo状态中
      commit('setUserInfo', { ...data, ...avatar }) // 展开运算符只是浅拷贝(拷贝第一层,引用类型会共享)
      // 返回角色roles 角色权限
      return data.roles
    },

    // 退出登录删除token与个人信息  1.后台退出 2.前端退出
    logout ({ commit }) {
      commit('removeToken')
      commit('delUserInfo')
      // 重置动态追加的路由(删除存在内存的)
      resetRouter()
      // 删除路由列表 中的动态路由 ===>只设置通用权限===> 在vuex模块里面用commit调用另一个模块要传入第三个参数{root:true}===> commit === this.$store.commit
      commit('menuRouter/updateRouter', [], { root: true })
    }
    /**
     * 总结：
     *1. 应用共享的一些状态数据，我们可以都放到vuex里管理，包括异步请求发送，这样更加方便维护
     *2. action函数触发完毕之后的返回值为promise  我们可以使用async + await 模拟同步写法
     */
  }
}
